#include "include.h"
#include "func.h"

f_spdif_t f_spdif;

spd_cfg_t spd_cfg;
#if FUNC_SPDIF_EN


//SPDIF断音时，可打开这个函数自定义调速,可以更加需要增加调速级数，该函数是spdif数据流每收到一包数据后自动回调的函数
//AUBUFFIFOCNT 表示DACBUF中剩余的数据量
//PHASECOMP 可以看成是S16数据类型,值越小，DAC播放速度越慢,如 负数的(0xFF80 = -128) 要比 (0xFFF0 = -16) 播放速度慢。正数的0x02要比0x10播放速度慢
//AT(.com_text.spdif_pcm)
//void spdif2dac_adjust(void)
//{
//    u16 au_size = (u16)AUBUFSIZE >> 4;  //1/16 AUBUFSIZE
//    if (AUBUFFIFOCNT <= (au_size * 2)) {        //2 / 16 -> 0xFF80  淘宝盒子采样率不标准，会播空
//        PHASECOMP = 0xFF80;
//    } else if (AUBUFFIFOCNT <= (au_size * 4)) { //4 / 16 -> 0xFFF0
//        PHASECOMP = 0xFFF0;
//    } else if (AUBUFFIFOCNT <= (au_size * 6)) { //6 / 16 -> 0xFFF8
//        PHASECOMP = 0xFFFE;
//    } else if (AUBUFFIFOCNT >= (au_size*14)) {  //14 / 16 -> 0x0010
//        PHASECOMP = 0x0010;
//    } else if (AUBUFFIFOCNT >= (au_size*12)) {  //12 / 16 -> 0x0004
//        PHASECOMP = 0x0004;
//    } else if (AUBUFFIFOCNT >= (au_size*10)) {  //10 / 16 -> 0x0002
//        PHASECOMP = 0x0002;
//    } else {
//        PHASECOMP = 0;
//    }
//}




#if SPF_REC_EN
void spf_rec_start(void);
void spf_rec_stop(void);

AT(.text.bsp.spf)
void spf_rec_init(void)
{
    rec_src.spr = SPR_44100;
    rec_src.source_start = spf_rec_start;
    rec_src.source_stop  = spf_rec_stop;
#if KARAOK_REC_EN
    rec_src.nchannel = 0x22;    //karaok的话录mp2
#else
    rec_src.nchannel = 2;
#endif
}
AT(.text.bsp.spf)
bool spf_rec_en(void)
{
    return true;
}
#endif

static void func_spdif_process(void)
{
    func_process();
    spdif_smp_detect();
#if !SPDIF_TASK_MANDATORY
    if (!spdif_is_online()) {
        func_cb.sta = FUNC_NULL;
    }
#endif
}
void func_spdif_mp3_res_play(u32 addr, u32 len)
{
    if (len == 0) {
        return;
    }
    spdif_exit();
    mp3_res_play(addr, len);
    spdif_init(&spd_cfg);
    spdif_start();
}

//返回true时,spdif_init(会动到USB时钟)内部有udisk_suspend/resume的操作。
//返回false时，需要在spdif_init前有调用udisk_suspend, spdif_init之后,调用udisk_resume恢复U盘
//AT(.text.spdif.init)
//bool spdif_udisk_suspend_resume_en(void)
//{
//    return false;
//}

//AT(.com_text.spdif_const)
//const char strx[] = ">";
//    static u32 ticks = 0;
//    if (tick_check_expire(ticks,100)) {
//        ticks = tick_get();
//        printf(strx);
//    }


//#define SPDIF_PRE_GAIN   GAIN_DIG_P6DB//GAIN_DIG_N0DB// GAIN_DIG_P12DB
//AT(.com_text.spdif_pcm)
//void spdif_pcm_process(s16 *ldata, s16 *rdata)  //SPDIF pcm数据流处理。   SPDIF==> spdif_pcm_process(pre_gain/drc)==> 硬件EQ ==> DAC
//{
//
//    s32 lvalue = *ldata;
//    s32 rvalue = *rdata;
//    lvalue = (lvalue * (int)SPDIF_PRE_GAIN) >> 13;
//    rvalue = (rvalue * (int)SPDIF_PRE_GAIN) >> 13;
//    drc_mono_process(&lvalue);
//    drc_mono_process(&rvalue);
//	*ldata = (s16)lvalue;
//	*rdata = (s16)rvalue;
//}


//AT(.com_text.spdif_pcm)
//void spdif_pcm_process(s16 *ldata, s16 *rdata)  //SPDIF pcm数据流处理,如对数据流进行消人声
//{
//    if (ext_rm_voice_en) {
//        dac_sw_rm_voice(ldata,rdata);
//    }
//}



static void func_spdif_enter(void)
{
    memset(&spd_cfg, 0, sizeof(spd_cfg_t));
    memset(&f_spdif, 0, sizeof(f_spdif_t));
    spd_cfg.channel = SPDIF_CH;

//#if PCM_DRC_EN
//    pcm_drc_res_init((u8*)RES_BUF_DRC_PCM_DRC);  //SPDIF 增加前级增益和DRC 处理方法见 spdif_pcm_process
//#endif

#if SYS_KARAOK_EN
    dac_fade_out();
    bsp_karaok_exit(AUDIO_PATH_KARAOK);
#endif

    spdif_init(&spd_cfg);
#if !SPDIF_TASK_MANDATORY
    if (!spdif_is_online()) {
        func_cb.sta = FUNC_NULL;
        return;
    }
#endif
    func_spdif_enter_display();
    func_cb.mp3_res_play = func_spdif_mp3_res_play;
#if WARNING_FUNC_SPDIF
    spdif_exit();
    mp3_res_play(RES_BUF_SPDIF_MODE_MP3, RES_LEN_SPDIF_MODE_MP3);
    spdif_init(&spd_cfg);
#endif // WARNING_FUNC_SPDIF

    spdif_start();

#if SPF_REC_EN
    spf_rec_init();
#endif

#if I2S_EN && (DMA_IN_I2S_SEL==SPDIF_DMA_I2S)
    bsp_i2s_init();
#endif // SPDIF_DMA_I2S_EN

#if SYS_KARAOK_EN
    bsp_karaok_init(AUDIO_PATH_KARAOK, FUNC_SPDIF);
#endif
}

static void func_spdif_exit(void)
{
    dac_fade_out();
    func_spdif_exit_display();
    spdif_exit();
    func_cb.last = FUNC_SPDIF;
#if I2S_EN && (DMA_IN_I2S_SEL==SPDIF_DMA_I2S)
    bsp_i2s_exit();
#endif // SPDIF_DMA_I2S_EN
}

AT(.text.func.spdif)
void func_spdif(void)
{
    printf("%s\n", __func__);

    func_spdif_enter();

    while (func_cb.sta == FUNC_SPDIF) {
        func_spdif_process();
        func_spdif_message(msg_dequeue());
        func_spdif_display();
    }

    func_spdif_exit();
}

#endif
